package fr.esisar.p2014.cs420.nsmwnr;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;

public class Connexion {
	Shell shell = null;
	private Shell shlConnexion;
	private Display display = null;
	
	private Text text;
	private Text text_1;
	private Text text_2;
	private Text text_3;
	private Text text_4;
	private Text text_5;
	private Text text_6;
	private Label label_1;
	private Label label_2;

	/**
	 * Constructeur de la classe, initialise uniquement
	 * l'écran à utiliser pour afficher la fenêtre
	 */
	public Connexion(){
		display = MainApp.display;
	}
	
	/**
	 * Cette fonction initialise la fenêtre si elle n'existe
	 * pas sur le bureau, ou la remet au premier-plan dans
	 * le cas contraire et actualise ses données.
	 */
	public void setActive(){
		if(shlConnexion == null || shlConnexion.isDisposed())
			run();
		else
			shlConnexion.setActive();
	}

	/**
	 * Cette fonction initialise la fenêtre.
	 * Elle se termine en l'affichant.
	 */
	/**
	 * @wbp.parser.entryPoint
	 */
	public void run(){

		shlConnexion = new Shell(display, SWT.APPLICATION_MODAL | ( SWT.SHELL_TRIM & ~SWT.RESIZE & ~SWT.MAX));		// Crée une fenètre non redimensionnable, au dessus des autres
		shlConnexion.setText("Connexion");
		shlConnexion.setSize(412, 365);
		shlConnexion.setImage(MainApp.icone);
		
		Label lblConnexion = new Label(shlConnexion, SWT.NONE);
		lblConnexion.setBounds(103, 10, 77, 15);
		lblConnexion.setText("CONNEXION");
		
		text = new Text(shlConnexion, SWT.BORDER);
		text.setBounds(103, 31, 284, 21);
		text.addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent arg0) {
				if (arg0.keyCode == 13 || arg0.keyCode == 16777296)
					try {
						connecter();
					} catch (SQLException e) {
						MainApp.erreurBase(e.getMessage());
					}
			}
		});
		
		text_1 = new Text(shlConnexion, SWT.BORDER | SWT.PASSWORD);
		text_1.addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent arg0) {
				if (arg0.keyCode == 13 || arg0.keyCode == 16777296)
					try {
						connecter();
					} catch (SQLException e) {
						MainApp.erreurBase(e.getMessage());
					}
			}
		});
		text_1.setBounds(103, 58, 284, 21);
		
		Label lblAdresseMail = new Label(shlConnexion, SWT.NONE);
		lblAdresseMail.setBounds(20, 34, 77, 15);
		lblAdresseMail.setText("Adresse mail :");
		
		Label lblMotDePasse = new Label(shlConnexion, SWT.NONE);
		lblMotDePasse.setBounds(20, 61, 77, 15);
		lblMotDePasse.setText("Mot de passe :");
		
		Button btnSeConnecter = new Button(shlConnexion, SWT.NONE);
		btnSeConnecter.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				try {
					connecter();
				} catch (SQLException e) {
					MainApp.erreurBase(e.getMessage());
				}
			}
		});
		btnSeConnecter.setBounds(307, 85, 80, 25);
		btnSeConnecter.setText("Se connecter");
		
		Label label = new Label(shlConnexion, SWT.SEPARATOR | SWT.HORIZONTAL);
		label.setBounds(0, 116, 406, 15);
		
		Label lblInscription = new Label(shlConnexion, SWT.NONE);
		lblInscription.setBounds(103, 137, 77, 15);
		lblInscription.setText("INSCRIPTION");
		
		text_2 = new Text(shlConnexion, SWT.BORDER);
		text_2.setBounds(103, 158, 284, 21);
		
		text_3 = new Text(shlConnexion, SWT.BORDER);
		text_3.setBounds(103, 185, 284, 21);
		
		text_4 = new Text(shlConnexion, SWT.BORDER | SWT.PASSWORD);
		text_4.setBounds(103, 212, 284, 21);
		
		text_5 = new Text(shlConnexion, SWT.BORDER);
		text_5.setBounds(103, 239, 284, 21);
		
		text_6 = new Text(shlConnexion, SWT.BORDER);
		text_6.setBounds(103, 266, 284, 21);
		
		Label lblNom = new Label(shlConnexion, SWT.NONE);
		lblNom.setBounds(64, 161, 33, 15);
		lblNom.setText("Nom :");
		
		Label lblPrnom = new Label(shlConnexion, SWT.NONE);
		lblPrnom.setBounds(49, 188, 48, 15);
		lblPrnom.setText("Pr\u00E9nom :");
		
		Label lblMotDePasse_1 = new Label(shlConnexion, SWT.NONE);
		lblMotDePasse_1.setBounds(20, 215, 77, 15);
		lblMotDePasse_1.setText("Mot de passe :");
		
		Label lblAdresseMail_1 = new Label(shlConnexion, SWT.NONE);
		lblAdresseMail_1.setBounds(22, 242, 75, 15);
		lblAdresseMail_1.setText("Adresse mail :");
		
		Label lblAdressePostale = new Label(shlConnexion, SWT.NONE);
		lblAdressePostale.setBounds(10, 269, 88, 15);
		lblAdressePostale.setText("Adresse postale :");
		
		Button btnSinscrire = new Button(shlConnexion, SWT.NONE);
		btnSinscrire.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				try {
					inscrire();
				} catch (SQLException e) {
					MainApp.erreurBase(e.getMessage());
				}
			}
		});
		btnSinscrire.setBounds(307, 293, 80, 25);
		btnSinscrire.setText("S'inscrire");
		
		label_1 = new Label(shlConnexion, SWT.NONE);
		label_1.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
		label_1.setBounds(20, 90, 286, 15);
		
		label_2 = new Label(shlConnexion, SWT.NONE);
		label_2.setBounds(10, 303, 296, 15);
		shlConnexion.open();
	}

	/**
	 * Vérifie les informations de connexion.
	 *  - Si elles sont bonnes, les informations sur le client
	 * dans MainApp sont mises à jour et la fenêtre se ferme.
	 *  - Sinon, un message d'erreur s'affiche.
	 * @throws SQLException
	 */
	public void connecter() throws SQLException{
		Statement stmt = JDBC.getInstance().getStatement();
		stmt.executeUpdate("SET TRANSACTION READ ONLY");
		ResultSet rset = stmt.executeQuery("SELECT nom, prenom, estAdmin, idClient, mail, adresse FROM Client WHERE mail LIKE '" + text.getText().toLowerCase().replace('\'', '_') + "' AND motDePasse LIKE '" + text_1.getText().replace('\'', '_') + "'");
		if (rset.next()){
			MainApp.nom = rset.getString(1);
			MainApp.prenom = rset.getString(2);
			if(rset.getString(3).equalsIgnoreCase("o"))
				MainApp.estAdmin = true;
			else
				MainApp.estAdmin = false;
			MainApp.idClient = rset.getInt(4);
			MainApp.mail = rset.getString(5).toLowerCase();
			MainApp.adresse = rset.getString(6);
			
			MainApp.rafraichir();
			shlConnexion.dispose();
		}else{
			label_1.setText("Identifiant ou mot de passe incorrect !");
		}
		stmt.executeUpdate("COMMIT");
		rset.close();
		stmt.close();
	}
	
	/**
	 * Ajoute le client dans la base si son adresse mail n'y
	 * est pas déjà, met à jour les information sur le client
	 * dans MainApp et se ferme.
	 * @throws SQLException
	 */
	public void inscrire() throws SQLException{
		if(text_2.getText().trim().equalsIgnoreCase("")){
			label_2.setText("Merci de saisir un nom valide !");
			return;
		}
		if(text_3.getText().trim().equalsIgnoreCase("")){
			label_2.setText("Merci de saisir un prénom valide !");
			return;
		}
		if(text_4.getText().trim().equalsIgnoreCase("")){
			label_2.setText("Merci de saisir un mot de passe !");
			return;
		}
		if(text_5.getText().trim().equalsIgnoreCase("")){
			label_2.setText("Merci de saisir une adresse mail valide !");
			return;
		}
		if(text_6.getText().trim().equalsIgnoreCase("")){
			label_2.setText("Merci de saisir une adresse postale valide !");
			return;
		}
		Statement stmt = JDBC.getInstance().getStatement();
		stmt.executeUpdate("SET TRANSACTION READ WRITE");
		ResultSet rset = stmt.executeQuery("SELECT mail FROM Client WHERE mail LIKE '" + text_5.getText().replace('\'', '_') + "'");
		if (rset.next()){
			label_2.setText("L'adresse mail existe déjà !");
		}else{
			stmt.executeUpdate("INSERT INTO Client(mail, adresse, nom, prenom, motDePasse, estAdmin) VALUES ('" + text_5.getText().toLowerCase().replace('\'', '_') + "','"
																														 + text_6.getText().replace('\'', '_') + "','"
																														 + text_2.getText().replace('\'', '_') + "','"
																														 + text_3.getText().replace('\'', '_') + "','"
																														 + text_4.getText().replace('\'', '_') + "','n')");
			MainApp.mail = text_5.getText().toLowerCase().replace('\'', '_');
			MainApp.adresse = text_6.getText().replace('\'', '_');
			MainApp.nom = text_2.getText().replace('\'', '_');
			MainApp.prenom = text_3.getText().replace('\'', '_');
			MainApp.estAdmin = false;
			rset = stmt.executeQuery("SELECT idClient FROM Client WHERE mail LIKE '" + text_5.getText().replace('\'', '_') + "'");
			rset.next();
			MainApp.idClient = rset.getInt(1);
			
			MainApp.rafraichir();
			shlConnexion.dispose();
		}
		stmt.executeUpdate("COMMIT");
		rset.close();
		stmt.close();
	}
	
	/**
	 * Réinitialise les informations du client dans MainApp.
	 */
	public void deconnecter(){
		MainApp.estAdmin = false;
		MainApp.idClient = 0;
		MainApp.nom = "";
		MainApp.prenom = "";
		MainApp.mail = "";
		MainApp.adresse = "";
		
		MainApp.rafraichir();
	}

	/**
	 * Cette fonction retourne vrai si la fenêtre est déjà
	 * visible à l'écran
	 */
	public boolean estLance(){
		return shlConnexion != null && !shlConnexion.isDisposed();
	}
}